import axios, { type AxiosRequestConfig, type AxiosResponse, type AxiosError } from 'axios';

// 创建axios实例
const api = axios.create({
  baseURL: 'http://localhost:8080/api', // 后端API基础路径
  timeout: 5000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json',
  },
});

// 请求拦截器
api.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    // 可以在这里添加认证token
    const token = localStorage.getItem('token');
    if (token) {
      config.headers = config.headers || {};
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error: AxiosError) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
api.interceptors.response.use(
  (response: AxiosResponse) => {
    // 处理响应数据
    return response.data;
  },
  (error: AxiosError) => {
    // 处理响应错误
    if (error.response) {
      // 服务器返回了错误状态码
      switch (error.response.status) {
        case 401:
          // 未授权，跳转登录页
          window.location.href = '/login';
          break;
        case 403:
          // 禁止访问
          console.error('禁止访问:', error.response.data);
          break;
        case 404:
          // 资源不存在
          console.error('资源不存在:', error.response.data);
          break;
        case 500:
          // 服务器内部错误
          console.error('服务器内部错误:', error.response.data);
          break;
        default:
          console.error('请求错误:', error.response.data);
      }
    } else if (error.request) {
      // 请求已发送但未收到响应
      console.error('请求超时或服务器未响应');
    } else {
      // 设置请求时发生错误
      console.error('请求配置错误:', error.message);
    }
    return Promise.reject(error);
  }
);

// 封装请求方法
const request = {
  /**
   * GET请求
   * @param url 请求路径
   * @param params 请求参数
   * @param config 额外配置
   * @returns Promise
   */
  get<T = any>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
    return api.get(url, { params, ...config });
  },

  /**
   * POST请求
   * @param url 请求路径
   * @param data 请求数据
   * @param config 额外配置
   * @returns Promise
   */
  post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return api.post(url, data, config);
  },

  /**
   * PUT请求
   * @param url 请求路径
   * @param data 请求数据
   * @param config 额外配置
   * @returns Promise
   */
  put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return api.put(url, data, config);
  },

  /**
   * DELETE请求
   * @param url 请求路径
   * @param params 请求参数
   * @param config 额外配置
   * @returns Promise
   */
  delete<T = any>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
    return api.delete(url, { params, ...config });
  },
};

export default request;